#include "sg90.h"
#include "hc05.h"

/**
 * SG90舵机初始化
 */
void SG90_Init(void){
  SG90_RCC_APBClkCmd_TIM(SG90_TIM_CLK,ENABLE);
  SG90_RCC_APBClkCmd_GPIO(SG90_GPIO_CLK,ENABLE);
    
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Pin=SG90_GPIO_PIN;
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;			// 复用推挽输出
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(SG90_GPIO_PORT,&GPIO_InitStruct);
    
	TIM_InternalClockConfig(SG90_TIM);															// 使用内部时钟源
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  TIM_TimeBaseInitStruct.TIM_Prescaler=72 - 1;										// 预分频器
  TIM_TimeBaseInitStruct.TIM_Period=SG90_PWM_PERIOD - 1; 					// 自动重装载值
  TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;					// 时钟分频
  TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;			// 向上计数模式
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;									// 重复计数器
  TIM_TimeBaseInit(SG90_TIM,&TIM_TimeBaseInitStruct);
    
  TIM_OCInitTypeDef TIM_OCInitStruct;
  TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;				// 使能输出
  TIM_OCInitStruct.TIM_Pulse=SG90_MIN_PULSE;											// 初始脉冲宽度（0°）
  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;						// 输出极性，高电平有效
	TIM_OC1Init(SG90_TIM,&TIM_OCInitStruct);
    
  TIM_Cmd(SG90_TIM, ENABLE);
}

/**
 * 设置SG90舵机角度
 */
void SG90_SetAngle(uint16_t angle){
	uint16_t pulse=SG90_MIN_PULSE+(angle*(SG90_MAX_PULSE-SG90_MIN_PULSE))/180;		// 脉冲宽度
	TIM_SetCompare1(SG90_TIM,pulse);			// 设置比较值
}
